package utwente.sem.eindopdracht;

/**
 * 
 * Een ProductRun is een specificatie van de fabricage van een bepaald type product. In
 * de ProductRun staat gespecificeerd welk Product er gemaakt moet worden, het aantal 
 * producten dat gemaakt moet worden en de tijd die staat voor het fabriceren. Een 
 * ProductRun object kan worden toegewezen aan een AssemblageLijn.
 * 
 * @author Richard Heijblom & Mark Wienk
 *
 */
public class ProductRun {

	private int tijd;
	private int aantalProducten;

	/**
	 * @clientCardinality *
	 * @supplierCardinality 1
	 */

	private Product product;
	
	/**
	 * Een ProductRun is een specificatie van de fabricage van een bepaald type product. In
	 * de ProductRun staat gespecificeerd welk Product er gemaakt moet worden, het aantal 
	 * producten dat gemaakt moet worden en de tijd die staat voor het fabriceren. Een 
	 * ProductRun object kan worden toegewezen aan een AssemblageLijn.
	 */
	public ProductRun() {}
	
	/**
	 * Geef een wizard voor het wijzigen van de product velden.
	 */
	public void showProductRunWizard() {
		Product[] producten = new Product[Controller.getController().getProductenLijst().size()]; 
		producten = Controller.getController().getProductenLijst().toArray(producten);
		this.setProduct(producten[Tui.getUI().toonMenu("Kies een product:", producten)]);
		Tui.getUI().toonBericht("Geef het gewenste aantal producten op:");
		this.setAantalProducten(Tui.getUI().getNumeriekeInvoer());
		Tui.getUI().toonBericht("Geef de gewenste tijdseenheid");
		this.setTijd(Tui.getUI().getNumeriekeInvoer());
	}

	/**
	 * Laat de info voor een product run zien.
	 * @return de info over de product run
	 */
	public String showInfo() {
		return  "Product: \t " + this.product.toString() + "\n" +
				"Aantal producten: \t " + this.aantalProducten + "\n" +
				"Toegewezen tijd: \t " + this.tijd + "\n";
	}
	
	/**
	 * Verkrijg het Product dat bij deze ProductRun is gespecificeerd.
	 * @return het Product van de ProductRun
	 */
	public Product getProduct() {
		return this.product;
	}
	
	/**
	 * Voeg een Product toe aan de specificatie van de ProductRun
	 * @param product het Product dat gemaakt dient te worden.
	 */
	public void setProduct(Product product) {
		this.product = product;
	}
	
	/**
	 * Verkrijg de gespecificeerde tijd voor de fabricage van de producten.
	 * @return een tijdshoeveelheid in seconden.
	 */
	public int getTijd() {
		return this.tijd;
	}
	
	/**
	 * Stel de tijd in voor het fabriceren van productne.
	 * @param tijd in seconden
	 */
	public void setTijd(int tijd) {
		this.tijd = tijd;
	}
	
	/**
	 * Verkrijg het aantal producten dat gefabriceerd moet worden.
	 * @return het aantal producten dat gespecificeerd is
	 */
	public int getAantalProducten() {
		return this.aantalProducten;
	}
	
	/**
	 * Stel het aantal producten dat gefabriceerd moet worden in
	 * @param aantal producten
	 */
	public void setAantalProducten(int aantal) {
		this.aantalProducten = aantal;
	}
	
	/**
	 * Geef de ProductRun weer voor weergave in een lijst. 
	 */
	public String toString() {
		return this.aantalProducten + " x " + this.product;
	}
	
	/**
	 * Geeft een menu met CRUD acties voor ProductRuns.
	 */
	public static void showMenu() {
		Tui.getUI().toonBericht("Product run menu");
		String[] keuzeOpties = {
				"Terug naar het vorige menu",
				"Nieuwe product run",
				"Bekijk product runs",
				"Wijzig product run",
				"Verwijder product run"
		};
		int productRunId;
		switch(Tui.getUI().toonMenu("Maak een keuze uit het menu", keuzeOpties)) {
			case 0:
				return;
			case 1:
				if(Controller.getController().getProductenLijst().isEmpty()) {
					Tui.getUI().toonBericht("Fout: er zijn nog geen producten aangemaakt, maak deze nu eerst.");
					Product.showMenu();
				} else {
					ProductRun productRun = new ProductRun();
					productRun.showProductRunWizard();
					Controller.getController().getProductRunLijst().add(productRun);
					Tui.getUI().toonBericht("Product run succesvol aangemaakt.");
				}
				showMenu();
				break;
			case 2:
				Tui.getUI().toonLijst("De volgende product runs zijn in het systeem bekend:", Controller.getController().getProductRunLijst().toArray());
				Tui.getUI().toonBericht("");
				showMenu();
				break;
			case 3:
				if(Controller.getController().getProductRunLijst().size() > 0) {
					productRunId = Tui.getUI().toonMenu("Geef een ProductRun id op", Controller.getController().getProductRunLijst().toArray());
					Controller.getController().getProductRunLijst().get(productRunId).showProductRunWizard();
				} else {
					Tui.getUI().toonBericht("Geen product runs aanwezig");
				}
				showMenu();
				break;
			case 4:
				if(Controller.getController().getProductRunLijst().size() > 0) {
					productRunId = Tui.getUI().toonMenu("Geef een ProductRun id op", Controller.getController().getProductRunLijst().toArray());
					Controller.getController().getProductRunLijst().remove(productRunId);
					Tui.getUI().toonBericht("Product run succesvol verwijderd");
				} else {
					Tui.getUI().toonBericht("Geen product runs aanwezig");
				}
				showMenu();
				break;
		}
	}
}
